package juego.Graficos;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;

import juego.Juego;
import juego.JuegoListener;
import juego.Movimiento;
import juego.Persistencia.PersistenciaDeJuego;

public class Partida extends JPanel implements JuegoListener{

	private static final long serialVersionUID = 1L;

	private JPanel cuerpoDerecha;
	private JPanel info;
	private JPanel flechas;
	private JLabel arriba;
	private JLabel abajo;
	private JLabel izquierda;
	private JLabel derecha;
	private JButton guardar;
	
	private JLabel puntaje;
	private JLabel movimientos;
	private JLabel vehiculo;

	private Juego juego;

	
	private ActionGuardarPartida actionGuardarPartida;
	private PanelTablero tablero;
	
	public Partida(ActionGuardarPartida unaActionGuardarPartida){
		actionGuardarPartida = unaActionGuardarPartida;
		_setearCuerpoPrincipal();	
	}
	
	private void _setearCuerpoPrincipal(){
		tablero = new PanelTablero();
		cuerpoDerecha = new JPanel();
		info = new JPanel();
		info.setBorder(new CompoundBorder(BorderFactory.createEtchedBorder(), new EmptyBorder(10, 10, 10, 10) ));
		guardar = new JButton();
		puntaje = new JLabel();
		movimientos = new JLabel();
		vehiculo = new JLabel();
		
		arriba = new JLabel(new ImageIcon(getClass().getResource("arriba.png")));
		arriba.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				juego.mover(Movimiento.arriba);
			}	
		});
		
		abajo = new JLabel(new ImageIcon(getClass().getResource("abajo.png")));
		abajo.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {			
				juego.mover(Movimiento.abajo);
			}	
		});

		izquierda = new JLabel(new ImageIcon(getClass().getResource("izquierda.png")));
		izquierda.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {				
				juego.mover(Movimiento.izquierda);
			}	
		});

		derecha = new JLabel(new ImageIcon(getClass().getResource("derecha.png")));
		derecha.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {			
				juego.mover(Movimiento.derecha);
			}	
		});

		guardar.setText("Guardar");
		guardar.setFont(new Font("sansserif",Font.PLAIN,20));
		
		puntaje.setFont(new Font("sansserif",Font.ITALIC,20));
		movimientos.setFont(new Font("sansserif",Font.ITALIC,20));
		vehiculo.setFont(new Font("sansserif",Font.ITALIC,20));
		
		guardar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				actionGuardarPartida.accionarGuardarPartida(juego);
			}	
		});
		
		
		setLayout( new BorderLayout() );
		
		cuerpoDerecha.setLayout(new BoxLayout(cuerpoDerecha, BoxLayout.Y_AXIS));
		info.setLayout(new BoxLayout(info, BoxLayout.Y_AXIS));
		
		vehiculo.setAlignmentX(Component.CENTER_ALIGNMENT);
		info.add(vehiculo);

		info.add(Box.createRigidArea(new Dimension(0,3)));
		
		JLabel label = new JLabel("Movimiento");
		label.setAlignmentX(Component.CENTER_ALIGNMENT);
		label.setFont(new Font("sansserif",Font.PLAIN,15));
		info.add(label);
		
		movimientos.setAlignmentX(Component.CENTER_ALIGNMENT);
		info.add(movimientos);
		
		info.add(Box.createRigidArea(new Dimension(0,3)));

		label = new JLabel("Puntaje");
		label.setAlignmentX(Component.CENTER_ALIGNMENT);
		label.setFont(new Font("sansserif",Font.PLAIN,15));
		info.add(label);

        puntaje.setAlignmentX(Component.CENTER_ALIGNMENT);
        info.add(puntaje);

        info.setAlignmentX(Component.RIGHT_ALIGNMENT);
        cuerpoDerecha.add(info);

        cuerpoDerecha.add(Box.createRigidArea(new Dimension(0,3)));
        guardar.setAlignmentX(Component.RIGHT_ALIGNMENT);
        cuerpoDerecha.add(guardar);
        
        
        cuerpoDerecha.add(Box.createRigidArea(new Dimension(0,3)));
		flechas=new JPanel() {
			private static final long serialVersionUID = 1L;

			public Dimension getMaximumSize() {
			    return getPreferredSize();
			}
		};
		
		flechas.setBorder(BorderFactory.createRaisedBevelBorder());
		flechas.setLayout(new BorderLayout());
		flechas.add(arriba,BorderLayout.NORTH);
		flechas.add(abajo,BorderLayout.SOUTH);
		flechas.add(izquierda,BorderLayout.WEST);
		flechas.add(derecha,BorderLayout.EAST);
        flechas.setAlignmentX(Component.RIGHT_ALIGNMENT);
        cuerpoDerecha.add(flechas);

		tablero.setBorder(new EmptyBorder(10, 10, 10, 10) );
		
		add(cuerpoDerecha,BorderLayout.EAST);
		add(tablero,BorderLayout.CENTER);
		
		setBorder(new EmptyBorder(20, 20, 20, 20) );
	}

	private void _displayEstado() {
		puntaje.setText(""+juego.contarPuntos());
		movimientos.setText(juego.getJugador().getCantidadDeMovimientos()+" de " +juego.getInfoTablero().darDificultad().getMaximoMovimientos());
		vehiculo.setIcon(new ImageIcon(getClass().getResource(juego.getJugador().getVehiculo().darSuNombre()+"_gde.png")));
	}
	
	public void setJuego(Juego juego) {
		this.juego = juego;
		juego.setJuegoListener(this);
		tablero.setJuego(juego);
		_displayEstado();
	}

	@Override
	public void refrescar() {
		if (juego.gano())
			actionGuardarPartida.accionarGanastePartida(juego.contarPuntos(), juego.contarMovimientos(), juego.contarSobrante());
		else if (juego.perdio())
			actionGuardarPartida.accionarPerdistePartida();
		else {
			_displayEstado();
			revalidate();
			repaint();
		}
	}
}
